package com.emagic.manage.mvp.domain;

import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import rx.subscriptions.Subscriptions;

/**
 * 连接Presenter与Data的交互器接口
 *
 * @author baoy
 * @version 1.0
 *          Create by 15/12/14 上午11:07
 */
public abstract class UseCase<T> {

    protected Subscription subscription = Subscriptions.empty();


    /**
     * 构建接口Observable
     *
     * @return
     */
    protected abstract Observable<T> buildObservable();

    /**
     * 执行订阅 <br/>
     * pm: 使用Observable.create方式创建的observable在订阅subscriber时，可以重复使用subscriber。
     * 而使用Observable.just方式创建observable时，最后在call被调用的时候会去执行setProducer()…这其中就会检查当前是否是isUnSubscribred()，如果isUnSubscribred()为true就不会执行onNext()、onCompleted()了。
     *
     * @param subscriber 订阅对象，每次传递新对象，不要使用复用的subscriber，可能会导致订阅不执行
     */
    @SuppressWarnings("unchecked")
    public void execute(Subscriber<T> subscriber) {
        this.subscription = this.buildObservable()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber);


    }

    /**
     * 取消订阅，在onDestroy方法中取消接口的订阅
     */
    public void unSubscribe() {
        if (!subscription.isUnsubscribed()) {
            subscription.unsubscribe();
        }
    }
}
